home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #2 / Ham Radio 2000 - Volume 2.iso / HAMV2 / TCP_IP / TNOS230S / IMPORT.C < prev    next >
C/C++ Source or Header  |  1997-09-07  |  5KB  |  228 lines

  1. /* PBBS Import file client
  2.  * Copyright 1995 Brian A. Lantz, KO4KS
  3.  */
  4. #include "global.h"
  5. #ifdef BBSIMPORT
  6. #include "ctype.h"
  7. #include "commands.h"
  8. #include "mbuf.h"
  9. #include "socket.h"
  10. #include "session.h"
  11. #include "netuser.h"
  12. #include "mailbox.h"
  13. #include "files.h"
  14. #include "smtp.h"
  15. #include "mailutil.h"
  16.  
  17.  
  18. #if !defined(_lint)
  19. static char rcsid[] OPTIONAL = "$Id: import.c,v 1.20 1997/09/07 21:18:28 root Exp root $";
  20. #endif
  21.  
  22. void importcmd (int mode, char *bbsname);
  23. static void importtick (void *p);
  24. static void parseimport (struct mbx *m);
  25.  
  26. static struct timer importtimer;
  27. #define MSPMINUTE (1000L*60L)
  28.  
  29.  
  30. int
  31. doimport(argc,argv,p)
  32. int argc;
  33. char *argv[];
  34. void *p OPTIONAL;
  35. {
  36.     if(argc < 2){
  37.         tprintf("import timer: %lu/%lu minutes\n",
  38.             read_timer(&importtimer)/MSPMINUTE,
  39.             dur_timer(&importtimer)/MSPMINUTE);
  40.         return 0;
  41.     }
  42.     if(*argv[1] == 'n') {
  43.         importtick(NULL);
  44.         return 0;
  45.     }
  46.     stop_timer (&importtimer);    /* just in case */
  47.     importtimer.func = (void (*)(void *))importtick;/* what to call on timeout */
  48.     importtimer.arg = NULL;        /* dummy value */
  49.     set_timer(&importtimer,atol(argv[1])*MSPMINUTE); /* set timer duration */
  50.     start_detached_timer(&importtimer);     /* fire it up */
  51.     return 0;
  52. }
  53.  
  54. static void
  55. importtick(p)
  56. void *p OPTIONAL;
  57. {
  58.     start_detached_timer(&importtimer);
  59.     /* Spawn off the process */
  60.     if (newproc("BBS import",(unsigned)1024,(void (*)(int,void*,void*))importcmd,0,(void *)0,(void *)0,0) == NULLPROC)
  61.     log (-1, "Couldn't start Import process");
  62. }
  63.  
  64. void
  65. importcmd (int mode, char *bbsname)
  66. {
  67. struct mbx *m;
  68. char buf[80], tempname[1024];
  69. struct ffblk ff;
  70. int oldoutput;
  71. int result = 0;
  72.  
  73.     m = newmbx (1);
  74.     oldoutput = Curproc->output;
  75.     Curproc->output = 0;
  76.     m->user = Curproc->output;
  77.     m->ps = Curproc;
  78.     m->state = MBX_FORWARD;
  79.     m->sid = MBX_SID;
  80.     strncpy (m->name, (bbsname) ? bbsname : "import", 20);
  81.  
  82.     if (!mode)    {
  83.         sprintf(buf,"%s/*.imp",IMPORTDir);
  84.         result = findfirst(buf, &ff, 0);
  85.     }
  86.     if (!result)    {
  87.         do    {
  88.             kwait(NULL);    /* Let others run */
  89.             if (mode)
  90.                 sprintf (tempname, "%s/import.txt", Mailspool);
  91.             else
  92.                 sprintf (tempname, "%s/%s", IMPORTDir, ff.ff_name);
  93.             if ((m->quickfile = fopen (tempname, READ_TEXT)) != NULLFILE)    {
  94.                 while (!feof(m->quickfile))    {
  95.                     kwait (NULL);
  96.                     m->change = 0;
  97.                     (void) fgets (m->line, MBXLINE, m->quickfile);
  98.                     if (feof(m->quickfile))
  99.                         continue;
  100.                     rip (m->line);
  101.                     if (!*m->line || !strnicmp (m->line, "/ex", 3))
  102.                         continue;
  103.                     if (tolower(*m->line) != 's' || m->line[2] != ' ')    {
  104.                         parseimport (m);
  105.                         result = 1;
  106.                         continue;
  107.                     }
  108.                     (void) mbx_parse(m);
  109.                     if (!m->change)    {    /* skip till '/EX' */
  110.                         while (!feof(m->quickfile))    {
  111.                             (void) fgets (m->line, MBXLINE, m->quickfile);
  112.                             if (feof(m->quickfile))
  113.                                 continue;
  114.                             if (!strnicmp (m->line, "/ex", 3))
  115.                                 break;
  116.                         }
  117.                     }
  118.                 }
  119.                 (void) fclose (m->quickfile);
  120. #if 1
  121.                 unlink (tempname);
  122. #endif
  123.             }
  124.         if (!mode)
  125.             result = findnext(&ff);
  126.         else
  127.             result = 1;
  128.             
  129.         } while (!result);
  130.     }
  131.  
  132.     smtptick(NULL);        /* wake SMTP to send that mail */
  133.     Curproc->output = oldoutput;
  134.     m->change = 0;
  135.     exitbbs(m);
  136.     return;
  137. }
  138.  
  139. static void
  140. parseimport (m)
  141. struct mbx *m;
  142. {
  143. char bid[24], to[80], from[60], subject[100];
  144. char msgtype = 'P', *cp, *retval;
  145. FILE *savefp;
  146. int done, headers, first = 1;
  147.  
  148.     savefp = m->quickfile;
  149.     done = 0;
  150.     headers = 0;
  151.     while (!feof(savefp))    {
  152.         while (!done)    {
  153.             if (first)
  154.                 first = 0;
  155.             else    {
  156.                 retval = fgets (m->line, MBXLINE, savefp);
  157.                 if (feof(savefp) || retval == NULLCHAR)
  158.                     goto done;
  159.             }
  160.             rip (m->line);
  161.             if (!*m->line)    {
  162.                 done = 1;
  163.                 continue;
  164.             }
  165.             switch (htype (m->line))    {
  166.                 case DATE:    /* do nothing with these */
  167.                 case CC:    break;
  168.                 case FROM:    cp = strchr (m->line, '@');
  169.                         if (cp)
  170.                             *cp = 0;
  171.                         strncpy (from, &m->line[6], 59);
  172.                         break;
  173.                 case TO:    strncpy (to, &m->line[4], 79);
  174.                         break;
  175.                 case SUBJECT:    strncpy (subject, &m->line[9], 99);
  176.                         break;
  177.                 case XBID:    strncpy (bid, &m->line[7], 23);
  178.                         break;
  179.                 case MSGTYPE:    msgtype = m->line[11];
  180.                         break;
  181.                 case BBSTYPE:    msgtype = m->line[16];
  182.                         break;
  183.                 case MSGID:    cp = strchr (m->line, '>');
  184.                         if (cp)
  185.                             *cp = 0;
  186.                         cp = strchr (m->line, '@');
  187.                         if (cp)    {
  188.                             if (!strnicmp (".bbs", &m->line[strlen (m->line) - 4], 4))
  189.                                 *cp = 0;
  190.                             else
  191.                                 *cp = '_';
  192.                         }
  193.                         cp = strchr (m->line, '<');
  194.                         if (cp)
  195.                             strncpy (bid, ++cp, 24);
  196.                         break;
  197.                 default:    continue;
  198.             }
  199.             headers = 1;
  200.         }
  201.         if (!headers)    {
  202.             done = 0;
  203.             continue;
  204.         }
  205.         m->quickfile = tmpfile ();
  206.         fprintf (m->quickfile, "%s\n", subject);
  207.         while (!feof(savefp))    {
  208.             retval = fgets (m->line, MBXLINE, savefp);
  209.             if (feof(savefp) || retval == NULLCHAR)
  210.                 goto done;
  211.             fputs (m->line, m->quickfile);
  212.             if (!strnicmp (m->line, "/ex", 3))
  213.                 break;
  214.         }
  215.         sprintf (m->line, "S%c %s < %s $%s", msgtype, to, from, bid);
  216.         rewind (m->quickfile);
  217.         (void) mbx_parse(m);
  218.         (void) fclose (m->quickfile);
  219.         done = 0;
  220.         headers = 0;
  221.     }
  222. done:
  223.     m->quickfile = savefp;
  224. }
  225.  
  226.  
  227. #endif /* BBSIMPORT */
  228.